Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Apuntes de fundamentos de programación unidad 4 (página 2)




Enviado por FRANCISCO RIOS ACOSTA



Partes: 1, 2

bsoluto, es decir, a un
lenguaje binario –instrucciones formadas por únicamente 1’s y 0’s-.

Cuando se pide que el programa sea ejecutado, éste deberá estar en formato binario –lenguaje binario-, sólo entonces el
procesador ejecuta el programa instrucción por instrucción, hasta que el programa termina.

La definición de programa va de la mano de la definición de algoritmo. Un algoritmo es una secuencia no ambigua, finita y
ordenada de instrucciones que han de seguirse para resolver un problema. Un programa implementa a un algoritmo, es
decir, lo traduce a un lenguaje de programación. El programa puede estar compuesto de instrucciones escritas en lenguaje
natural, en nuestro caso el español, o bien en un lenguaje de alto nivel.

Otra manera en que se ejecuta un programa, es ejecutar las instrucciones conforme son encontradas, una a una. A este
proceso se le llama interpretar y a los programas que lo hacen se les conoce como intérpretes.

4.2.2 Programación. es un proceso por el cual se escribe en un lenguaje de programación, se prueba, se depura y se
mantiene el código fuente de un programa.

4.2.3 Lenguaje de programación. es un lenguaje que consiste en un conjunto de símbolos y reglas sintácticas y semánticas
que definen su estructura y el significado de sus elementos y expresiones. Un lenguaje de programación permite a uno o
más programadores especificar de manera precisa: sobre qué datos una computadora debe operar, cómo deben ser estos
almacenados, transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias.

Una característica relevante de los lenguajes de programación es precisamente que más de un programadores puedan tener
un conjunto común de instrucciones que puedan ser comprendidas entre ellos para realizar la construcción del programa de
forma colaborativa.

El lenguaje de programación que usaremos en nuestro curso para implementar programas de computadora, es el lenguaje
C#. El lenguaje C# es un lenguaje que permite escribir programas orientados a objetos.

4.3 Datos.

4.3.1 Definición de datos. es una representación simbólica (numérica, alfabética, booleana, entre otras), atributo o
característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado
(procesado) se puede utilizar en la realización de cálculos o toma de decisiones. Los datos es la materia prima para los
programas, y a partir de ellos se construye la información (datos de salida).

Los datos son comunicados por varios tipos de símbolos tales como las letras del alfabeto, números, movimientos de labios,
puntos y rayas, señales con la mano, dibujos, etc. Estos símbolos se pueden ordenar y reordenar de forma utilizable y se les
denomina información.

Los datos son símbolos que describen condiciones, hechos, situaciones o valores. Los datos se caracterizan por no contener
ninguna información. Un dato puede significar un número, una letra, un signo ortográfico o cualquier símbolo que
represente una cantidad, una medida, una palabra o una descripción.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 4 de 17
La importancia de los datos está en su capacidad de asociarse dentro de un contexto para convertirse en información. Por si
mismos los datos no tienen capacidad de comunicar un significado y por tanto no pueden afectar el comportamiento de
quien los recibe. Para ser útiles, los datos deben convertirse en información para ofrecer un significado, conocimiento, ideas
o conclusiones.

Los datos se clasifican en :



variables
constantes
expresiones
Las variables son datos que pueden sufrir cambios en su valor durante la ejecución de un programa –o un alogoritmo-. Por
ejemplo, la velocidad de un carro, el atributo nombre de un objeto Alumno, la edad de un objeto Persona, el radio de un
círculo.
Las constantes son datos cuyo valor no puede ser cambiado en el transcurso de un programa. Ejemplos que podemos citar
son : PI representando al valor 3.1416, MAXALU representando al número máximo de alumnos en un grupo, VELLUZ
cuyo valor es 300 000 m/seg representa a la velocidad de la luz. Las constantes de tipo literal son aquellas que se denotan
directamente por un valor, por ejemplo : el número entero 100, -30.75 que es un número real, una mensaje de error
“ERROR DE SINTAXIS”.

Las expresiones están compuestas de operandos ya sea variables y/o constantes, que forman parte de una operación sujeta a
determinados operadores. Por ejemplo veamos las 4 expresiones :

MAXALU / 2.0

(b – sqrt(b*b – 4*a*c)) / (2.0 * a)

“hola” + “mundo”

PI * pow(radio,2.0)

4.3.2 Tipos de datos. establecen los posibles valores que puede tomar un dato. Siempre que manejemos un dato debemos de
asociarle además de un identificador, el tipo de dato al que pertenece. Por ejemplo, el atributo calificación de un objeto
de la clase Alumno, es de tipo entero y los rangos de valores que puede tomar son del 0 al 100, es decir, el 0, 1, 2, 3,
4,…,99,100. El nombre de un objeto Persona es de tipo cadena, y sus valores deberán contener sólo letras y blancos. El
área de un círculo es de tipo real –númerico con punto flotante, enteros y decimales-. El tipo de dato para un objeto siempre
será el nombre de la clase a la que pertenece. Por ejemplo, un alumno será de tipo Alumno –su clase-.

Los lenguajes de programación tienen tipos de datos predefinidos, que también reciben el nombre de tipos de datos básicos
o primitivos. El lenguaje C# proporciona los tipos de datos básicos :
TIPO DE DATO
short

int

long

float

double

decimal

string

char

bool
DESCRIPCIÓN
entero corto

Números enteros

Enteros largos

Números de punto flotante

Números de punto flotante de doble precisión

Valores monetarios

Secuencia de caracteres

Un solo caracter

Valores booleanos
RANGO DE VALORES
-32768 hasta 32767
-231 hasta 231-1
-263 hasta 263-1
-3.4 x 1038 hasta 3.4 x 1038
-1.7 x 10308 hasta 1.7 x 10308

Hasta 28 cifras significativas

No aplicable
0 hasta 216-1

true o false
Veamos algunos ejemplos donde definimos los atributos de objetos en una clase indicando su tipo de dato y su
identificador, en el lenguaje C#.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 5 de 17
class Alumno
{
string noControl;
string nombre;
int calif;

}

class Persona
{
string nombre;
int edad;
char sexo;

}

class Empleado
{
string nombre;
string puesto;
decimal salario;

}

class circulo
{
float radio;
float abscisaCentro;
float ordenadaCentro;

}

Notemos que la declaración de un atributo incluye al tipo, al identificador, terminando en el caracter (;).

4.3.3 Identificadores. es un nombre con el que reconocemos algún elemento de nuestro código, ya sea una clase, una
variable,un objeto, un método, una constante, un atributo, una propiedad, entre otros. Este identificador es usado para
referenciar al elemento mismo sea variable, objeto, método, clase, etc..

Las reglas para formar identificadores en C# son :



Deben comenzar con letra o con guión bajo.
Pueden continuar con letras, dígitos y/o guiones bajos.
No deben ser iguales a una palabra reservada del lenguaje.
Existen diferentes notaciones para la construcción de identificadores, nosotros utilizaremos 2 :


Notación Camello.
Notación Pascal.
La notación Camello nos dice que la palabra de inicio del identificador debemos empezarla con minúscula. Si existen mas
palabras en el identificador, deberán iniciarse con mayúscula. Esta notación la usaremos para identificadores de atributos,
variables –objetos-. Algunos ejemplos son :

noControl
razonSocial
noSeguroSocial
radio
noLlantasDelanteras

La notación Pascal es lo mismo que la Camello, con la diferencia de que todas las palabras son iniciadas con mayúsculas.
esta notación es usada para nombrar clases, métodos, propiedades. Enseguida tenemos algunos ejemplos :

class Alumno
{

}

Digamos que algunos métodos de la clase Alumno son : AsignarCalificacion(), AsignarNombre(), VisuaNoControl().

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 6 de 17
4.3.4 Almacenamiento, direccionamiento y representación en memoria. El almacenamiento de datos se refiere al lugar
donde ellos residen. Existen 2 formas de almacenar datos : en memoria RAM y en memoria secundaria –disco, usb-. Los
datos almacenados en memoria RAM se pierden –son volátiles- cuando la computadora es apagada o cuando termina su
ejecución el programa que los ha creado y almacenado. La memoria secundaria permite que los datos permanezcan
almacenados de manera permanente en un sistema de archivos.

El direccionamiento es un proceso asociado al manejo de la memoria de una computadora. La memoria está compuesta de
unidades denominadas bytes. Un byte a su vez se compone de 8 bits. Un bit mantiene un valor binario : 1 o 0. Los datos se
almacenan en memoria usando uno o mas bytes según el tipo del dato. Cada byte en memoria tiene una dirección única, de
manera que sabiendo esta dirección, podemos acceder al valor de un dato. Los valores de dirección de memoria se
representan usando la notación hexadecimal. El identificador de un dato es una referencia a la dirección de memoria donde
se almacena el dato. Por ejemplo, digamos que tenemos una variable entera cuyo identificador es i, su declaración es :

int i;

La variable i tendrá su lugar en memoria y según el lenguaje utilizado será el número de bytes que se le asignen para
representarlo en memoria.
i
D0FF
La caja representa los bytes en memoria que se le han asignado a la variable i. El número hexadecimal D0FF es la dirección
de memoria que le ha correspondido a los bytes donde se almacenará el valor de la variable i. Nosotros como
programadores no sabemos el valor de la dirección de memoria que se le ha reservado a nuestra variable i. Lo que si
conocemos es el identificador con el cual vamos a manejar al dato entero que representa la i. De manera que sólo con saber
como hacemos una sentencia de asignación en el lenguaje que usemos –en nuestro caso el lenguaje C#-, podemos acceder al
dato y depositar en los bytes que le corresponden un valor determinado. Veamos la sentencia de asignación a la variable i
que termina en caracter (;).

i = 100;

Después de ser ejecutada la sentencia de asignación a la variable i, debemos abstraer que los bytes que corresponden al dato
representado por la variable i, tendrán o almacenan el valor del número entero 100.
i
D0FF
En lenguaje C# los diferentes tipos de datos básicos o predefinidos se representan usando cierta cantidad de bytes, según sea
el rango de valores que manejen. La tabla a continuación muestra dicha información.
TIPO DE DATO
short

int

long

float

double

decimal

string

char

bool
DESCRIPCIÓN
entero corto

Números enteros

Enteros largos

Números de punto flotante

Números de punto flotante de doble precisión

Valores monetarios

Secuencia de caracteres

Un solo caracter

Valores booleanos
No. de bytes
2

4

8

4

8

16

2 bytes por caracter

2

1
100

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 7 de 17
4.3.5 Sistema de numeración binaria y hexadecimal. Los datos númericos tienen diferentes maneras de ser representados.
La representación por default es la decimal, pero existen otros sistema igualmente útiles para ciertas ocasiones. Otras 2
representaciones muy usadas son la binaria, la octal y la hexadecimal.

El sistema de numeración binaria tiene como alfabeto sólo 2 símbolos : { 0, 1 }. Para formar un número binario sólo
podemos echar mano de estos 2 símbolos. Un número en cualquier sistema númerico se forma de dígitos que tienen un
cierto valor significativo, que está dado por una potencia del número base. Por ejemplo, un número en sistema decimal
digamos el 51, se concibe su valor de acuerdo a :
101=10

5

5 x 10=50
100=1

1

1 x 1=1
valor

50+1=51
Ahora veamos al número binario 111101 que valor decimal representa.
25=32

1

1 x 32=32
24=16

1

1 x 16=16
23=8

0

0 x 8=0
22=4

0

0 x 4=0
21=2

1

1 x 2=2
20=1

1

1 x 1=1
valor

32+16+0+0+2+1=51
El 51 decimal es representado en binario como 110011.

Podemos convertir un valor decimal a un número binario haciendo divisiones sucesivas del número decimal entre la base a
la cual se requiere cambiar. En cada división se cambia el dividendo por el cociente de la anterior división. Las divisiones se
efectúan hasta que el cociente sea 0. Hagámoslo con el número 51 :
51 / 2 =

25 / 2 =

12 / 2 =

6 / 2 =

3 / 2 =

1 / 2 =
cociente

25

12

6

3

1

0
Residuo

1

1

0

0

1

1
Bit menos significativo

Bit mas significativo
Un número mas pequeño digamos el 12 :
12 / 2 =

6 / 2 =

3 / 2 =

1 / 2 =
cociente

6

3

1

0
Residuo

0

0

1

1
Bit menos significativo

Bit mas significativo
Ejercicios propuestos :



Convierte el número binario 1010101010 a decimal.
Convierte el número decimal 112 a binario.
Convierte el número binario 11111000 a decimal.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 8 de 17
El sistema numérico hexadecimal tiene como alfabeto a 16 símbolos { 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F }. A partir de
la combinación de estos símbolos se construyen los números hexadecimales. Ejemplos de números hexadecimales son 21,
AA, F4AC, 1234, CBFE. Su correspondiente número decimal para cada número hexadecimal es el mostrado en la tabla
siguiente.
Valor decimal

32+1=33

160+10=170

61440+1024+160+12=62636

4096+512+48+4=4660
163=4096

F

15 X 4096=61440

1

1 X 4096=4096

C
162=256

4

4 X 256=1024

2

2 X 256=512

B
161=16

2

2 x 16=32

A

10 x 16=160

A

10 X 16=160

3

3 X 16=48

F
160=1

1

1 x 1=1

A

10 x 1=10

C

12 X 1=12

4

4 X 1=4

E
Házlo de ejercicio

La conversión de un decimal a un hexadecimal se efectúa de manera similar a como lo hicimos con el binario, sólo debemos
cambiar el divisor a la base 16. Veamos algunos ejemplos.

El número decimal 33 en hexadecimal es el 21.
33 / 16 =

2 / 16 =
cociente

2

0
Residuo

1

2
Bit menos significativo

Bit mas significativo
El número decimal 62716 en hexadecimal es el F4FC.
62716 / 16 =

3919 / 16 =

244 / 16 =

15 / 16 =
cociente

3919

244

15

0
Residuo

12=C

15=F

4

15=F
Bit menos significativo

Bit mas significativo
En ocasiones se requiere de una conversión de binario a hexadecimal o al contrario, de hexadecimal a binario. La regla que
se sigue es que para cada símbolo hexadecimal, le corresponden 4 símbolos binarios. En la tabla siguiente se han listado
algunos ejemplos de conversión de binario a hexadecimal si lo vemos de izquierda a derecha, y de hexadecimal a binario si
lo vemos de derecha a izquierda. Los números binarios se han separado en grupos de 4 símbolos de derecha a izquierda.
binario

101 1100

1100 1111

1001

01 0001
hexadecimal

5A

AF

9

11

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 9 de 17
4.4 Operadores, operandos y expresiones.

Operadores. Los operadores nos permiten manipular datos, sean variables, constantes, otras expresiones, objetos, atributos
de objetos, entre otros, de manera que podamos (1) transformarlos, (2) usarlos en decisiones para controlar el flujo de
ejecución de un programa, (3) formar valores para asignarlos a otros datos. El tipo de datos involucrado en una expresión se
relaciona muy de cerca con los operadores utilizados.
En nuestro curso veremos 7 tipos de operadores :







aritméticos.
relacionales
lógicos
asignación
incremento
decremento
concatenación
A continuación listaremos en tablas, a cada clasificación de operadores utilizando el lenguaje C#.

Operadores aritméticos. sus operandos son numéricos int, float, double.
operador
+
descripción
suma
uso
a + b
+a
Tipo según operandos
binario
monario
conversión implícita
int + float = float
int + double = double
float + double = double

resta
a – b
-a
binario
monario
idem operador +
*

/

%
multiplicación

división

residuo
a * b

a / b

a % b
binario

binario

binario
idem operador +

idem operador +

no aplicable
Ejercicios propuestos :

Indica la conversión implícita para short + int.
Operadores relacionales. sus operandos son numéricos int, float, double.
operador
<

>=

==

!=
descripción
menor que

menor o igual que

mayor que

mayor o igual que

igual que

diferente que
uso
a < b

a b

a >= b

a == b

a != b
Tipo según operandos
binario

binario

binario

binario

binario

binario
Operadores lógicos. sus operandos son expresiones relacionales.
operador
&&

||

!
descripción
y

o

no
uso
a && b

a || b

! a
Tipo según operandos
binario

binario

monario

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 10 de 17
Operadores de asignación. sus operandos son numéricos int, float, double.
operador
=

+=

-=

*=

/=

%=
descripción
asignación

suma

resta

multiplicación

división

residuo
uso
a = b

a += b, a = a + b

a –= b, a = a – b

a *= b, a = a * b

a /= b, a = a / b

a %= b, a = a % b
Tipo según operandos
binario

binario

binario

binario

binario

binario
Operadores de incremento y decremento. sus operandos son numéricos int, float, double.
operador
++


descripción
incremento

decremento
uso
a++, postfijo, a=a+1
++a, prefijo, a=a+1

a–, postfijo, a=a-1
–a, prefijo, a=a-1
Tipo según operandos
monario
monario

monario
monario
Operador de concatenación. se utilza para concatenar cadenas, sus operandos son de tipo string.
operador
+

+=
descripción
concatenación

asignación y concatenación
uso
s = s1 + s2

s += s1, concatena los caracteres de s1 a s.
Tipo según operandos
binario

binario
Operandos. Son los datos a los que se les asocia un operador para efectuar una determinada operación con sus valores.
Recordemos que los datos pueden ser variables o constantes. En cuanto a los datos variables ya sabemos que se les asocia
un identificador y un tipo de dato, además que su identificador es una referencia a la dirección de memoria donde se ha
almacenado el valor del dato. Por ejemplo, el operador + es usado para la suma de las variables x y y , su resultado es
asignado al dato x mediante el uso del operador de asignación =.

x = x + y;

Los datos constantes involucrados como operandos pueden ser :


literales, que son especificados por medio de un valor escrito en el código.
simbólicas, especificadas por medio de un identificador asociado con un literal. Son mas recomendadas que el uso de
literales. ¿Por qué? discútelo con tu profesor.
Ejemplo de constantes literales :

int ancho = 80;
string mensaje=”ERROR”;
80
y “ERROR” son constantes literales. Observa que las literales también tienen tipo. Notemos que el 80 no se ha escrito con
un punto al final. Las constantes literales de tipo cadena –string- se deben ecerrar entre comillas. Una constante literal de
tipo float debe terminar en f ó F. Las doubles no deben tener esta terminación. Enseguida se muestran los ejemplos
correspondientes a constantes float -> 200.56F, y double -> 3.1416.

float x = 200.56F;
double pi=3.1416;

Las constantes literales de tipo caracter –char- deberán ser escritas encerradas entre apóstrofes. Deberán contener un solo
caracter , por ejemplo ‘M’ asignado al dato variable sexo :

char sexo=’M’;

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 11 de 17
Ejemplo de constantes simbólicas :

const float PI=3.1416f;

Luego podemos usar la constante simbólica PI en una expresión, mediante su identificador :

float area, radio=1.5f;
area = PI * radio * radio;

Notemos que una constante simbólica usa un identificador asociado a un literal, y que su definición requiere de la palabra
reservada del lenguaje const.

Expresiones. involucran operandos y operadores, siempre el resultado de la evaluación de una expresión es de un cierto
tipo. La evaluación de una expresión la veremos en la siguiente sección. Por ahora diremos que dependiendo de los
operadores involucrados, la expresión se denominará de asignación, aritmética, relacional, lógica, de incremeno, de
decremento, de concatenación. Existen expresiones compuestas, pero el resulado será de un solo tipo. Veamos algunos
ejemplos donde explicaremos algunas cuestiones acerca de las expresiones.
expresión
int num = 100 + 40.3;

int noVueltas = 10 * 3;

float x = 10.0 + 75.2;

float x = 10.0F + 75.2F;

string s = ”HOLA” + “ MUNDO”;

char sexo = ”M”;

char sexo = ‘M’;
comentarios
No podemos mezclar constantes literales enteras y dobles
para asignarlas a un dato entero.

Las constantes literales son todas enteras. La expresión
es valida.

Error. Las constantes literales cuando trabajamos con
float, deben terminar con f.

Se ha corregido el error.

Tenemos 2 constantes literales de tipo string –cadena-.
La expresión esta bien. El resultado depositado en la
variable s, es la concatenación de las 2 constantes
literales cadena, s tiene le valor de “HOLA MUNDO”.

ERROR, una constante literal string no puede asignarse a
un dato tipo char. Los datos tipo char sólo pueden
contener un solo caracter, además de que una constante
literal char debe ser encerrada entre apóstrofes.

La expresión de asignación ahora es correcta, ya que la
estado
ERROR

OK

ERROR

OK

OK

ERROR

OK
constante literal es de tipo char, es decir, se ha
encerrado entre apóstrofes.

4.5 Prioridad de operadores, evaluación de expresiones.

Prioridad de operadores. Los programas de computadora evalúan expresiones de tipo aritméticas, relacionales, lógicas, de
incremento, de decremento, de asignación, entre otras, tomando en cuenta las prioridades predefinidas por el lenguaje para
los diferentes operadores. Esto lo apuntamos, debido a que las expresiones pueden involucrar a diferente tipo de operadores,
por ejemplo :

! x < 0 && y >= x * 12.0 – 5.5

Digamos que x tiene el valor de 10, y el valor de 200.4, entonces ¿cuál sería el valor que retorna la expresión?. Para
calcularlo deberemos conocer la prioridad de ejecución de los diferentes tipos de operadores en el lenguaje de programación
que en nuestro caso es el C#. La prioridad de ejecución puede ser alterada por el programador por medio del uso de los
paréntesis.
Otra cuestión importante en la evaluación de una expresión, es que ésta es ejecutada de izquierda a derecha por la
computadora.
Entonces para saber cómo es evaluada una expresión, debemos conocer 3 cuestiones : (1) la prioridad de ejecución de los
operadortes involucrados, (2) la evaluación es realizada de izquierda a derecha, (3) el uso de paréntesis permite la alteración
de la prioridad de ejecución.

Monografias.com

Ing. Francisco Ríos Acosta
Apuntes de Fundamentos de Programación.
Instituto Tecnológico de la Laguna, a 18 de agosto del 2008.
pag. 12 de 17
En la tabla mostrada a continuación podemos ver la prioridad de ejecución de ciertos operadores en C#.
NIVEL DE PRIORIDAD
1
2
OPERADORES
()
! – + ++ —
(Nota : el menos y el mas cuando son usados como operadores
monarios)
3
*
/
%
4
+

(Nota : usados como operadores binarios)
>
>=
5

6
<

==

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter